#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

void test_nonblock_io() {
	    printf("=== 测试非阻塞I/O ===\n");
	        
	        // 创建测试文件并写入一些数据
		     int fd = open("test_nonblock.txt", O_CREAT | O_RDWR, 0644);
		         if (fd == -1) {
		                 perror("open");
		                         exit(EXIT_FAILURE);
		                             }
		                                 write(fd, "测试数据\n", 10);
		                                     lseek(fd, 0, SEEK_SET);  // 重置文件指针
		                                         
		                                             // 1. 测试阻塞模式下的读取
		                                                 printf("\n[测试1] 阻塞模式读取:\n");
		                                                     char buf[100];
		                                                         int n = read(fd, buf, sizeof(buf));
		                                                             printf("读取到%d字节数据: %s\n", n, buf);
		                                                                 lseek(fd, 0, SEEK_SET);
		                                                                     
		                                                                         // 2. 设置为非阻塞模式
		                                                                             int flags = fcntl(fd, F_GETFL);
		                                                                                 fcntl(fd, F_SETFL, flags | O_NONBLOCK);
		                                                                                     printf("\n[测试2] 已设置为非阻塞模式\n");
		                                                                                         
		                                                                                             // 3. 测试非阻塞读取
		                                                                                                 n = read(fd, buf, sizeof(buf));
		                                                                                                     if (n == -1) {
		                                                                                                             printf("非阻塞读取返回-1，errno=%d(%s)\n", errno, strerror(errno));
		                                                                                                                 } else {
		                                                                                                                         printf("读取到%d字节数据: %s\n", n, buf);
		                                                                                                                             }
		                                                                                                                                 
		                                                                                                                                     // 4. 测试非阻塞写入
		                                                                                                                                         printf("\n[测试3] 测试非阻塞写入:\n");
		                                                                                                                                             n = write(fd, "新数据\n", 8);
		                                                                                                                                                 if (n == -1) {
		                                                                                                                                                         printf("非阻塞写入返回-1，errno=%d(%s)\n", errno, strerror(errno));
		                                                                                                                                                             } else {
		                                                                                                                                                                     printf("成功写入%d字节\n", n);
		                                                                                                                                                                         }
		                                                                                                                                                                             
		                                                                                                                                                                                 close(fd);
		                                                                                                                                                                                 }
		
		                                                                                                                                                                                 int main() {
		                                                                                                                                                                                     test_nonblock_io();
		                                                                                                                                                                                         return 0;
		                                                                                                                                                                                         }
